#version 300 es
/**
 *顶点着色器（glsl是gl shader language的意思)编写脚本通过gl动态编译，然后加载到gpu中执行，gpu会并行对多个
 *顶点都执行这段程序进行顶点位置变换，将最终的顶点位置赋予gl_Position即可
 * 注意3.0 api修改了很多https://blog.csdn.net/lb377463323/article/details/77047221
 *
 *变量类型：
 *uniform
 *  外部application程序传递给（vertex和fragment）shader的变量。因此它是application通过函数glUniform**（）
 *  函数赋值的。在（vertex和fragment）shader程序内部，uniform变量就像是C语言里面的常量（const ），它不能被
 *  shader程序修改。（shader只能用，不能改）
 *
 *  如果uniform变量在vertex和fragment两者之间声明方式完全一样，则它可以在vertex和fragment共享使用。
 *  （相当于一个被vertex和fragment shader共享的全局变量）
 *
 *  uniform变量一般用来表示：变换矩阵，材质，光照参数和颜色等信息。
 *
 *attribute (es3 中使用in来表示)
 *  只能在vertex shader中使用的变量。（它不能在fragment shader中声明attribute变量，也不能被fragment
 *  shader中使用）
 *  一般用attribute变量来表示一些顶点的数据，如：顶点坐标，法线，纹理坐标，顶点颜色等。
 *  在application中，一般用函数glBindAttribLocation（）来绑定每个attribute变量的位置，然后用函数
 *  glVertexAttribPointer（）为每个attribute变量赋值。
 *
 *varying (es3 中使用out来表示)
 *  varying变量是vertex和fragment shader之间做数据传递用的。一般vertex shader修改varying变量的值，然后
 *  fragment shader使用该varying变量的值。因此varying变量在vertex和fragment shader二者之间的声明必须是一
 *  致的。application不能使用此变量。
 *
 */
// 对顶点位置的影响因素一般有三个，模型自身的变换，视窗的变换，场景的变幻，由外部设定
// 模型变换
uniform mat4 ModelMatrix;
// 视窗变换
uniform mat4 ViewMatrix;
// 场景变换
uniform mat4 ProjectionMatrix;

//四维向量，作为坐标表示
in vec4 position;
//四维向量，作为颜色表示
in vec4 color;
//将顶点颜色与片段着色器共享
out vec4 V_Color;

// 纹理坐标
in vec2 texcoord;
// 将顶点2d纹理坐标与片段着色器共享
out vec2 V_Texcoord;

/***
*   gpu 是有很多个核，因此计算每个点到屏幕的位置是 并行计算的
*/
void main(){

    V_Color = color;
    //将点的位置应用于
    gl_Position = ProjectionMatrix*ViewMatrix*ModelMatrix*position;

    V_Texcoord = texcoord;
}